import { OpenAICompatibleEmbedder } from "./openai-compatible"
import { IEmbedder, EmbeddingResponse, EmbedderInfo } from "../interfaces/embedder"
import { MAX_ITEM_TOKENS } from "../constants"
import { t } from "../../../i18n"
import { TelemetryEventName } from "@roo-code/types"
import { TelemetryService } from "@roo-code/telemetry"

/**
 * 阿里云通义千问 embedder 实现，基于 OpenAI 兼容的 API 格式
 *
 * 支持的模型：
 * - text-embedding-v1 (维度: 1536)
 * - text-embedding-v2 (维度: 1536)
 *
 * 参考文档：https://help.aliyun.com/zh/model-studio/embedding
 */
export class AliyunEmbedder implements IEmbedder {
	private readonly openAICompatibleEmbedder: OpenAICompatibleEmbedder
	private static readonly ALIYUN_BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"
	private static readonly DEFAULT_MODEL = "text-embedding-v1"
	private readonly modelId: string

	/**
	 * 创建新的阿里云通义千问 embedder
	 * @param apiKey 阿里云 API Key
	 * @param modelId 模型 ID (默认为 text-embedding-v1)
	 */
	constructor(apiKey: string, modelId?: string) {
		if (!apiKey) {
			throw new Error(t("embeddings:validation.apiKeyRequired"))
		}

		// 使用提供的模型或默认模型
		this.modelId = modelId || AliyunEmbedder.DEFAULT_MODEL

		// 创建 OpenAI 兼容的 embedder，使用阿里云的配置
		this.openAICompatibleEmbedder = new OpenAICompatibleEmbedder(
			AliyunEmbedder.ALIYUN_BASE_URL,
			apiKey,
			this.modelId,
			MAX_ITEM_TOKENS,
		)
	}

	/**
	 * 为给定的文本创建嵌入向量
	 * @param texts 要嵌入的文本字符串数组
	 * @param model 可选的模型标识符
	 * @returns 解析为嵌入响应的 Promise
	 */
	async createEmbeddings(texts: string[], model?: string): Promise<EmbeddingResponse> {
		try {
			// 使用提供的模型或回退到实例的模型
			const modelToUse = model || this.modelId
			return await this.openAICompatibleEmbedder.createEmbeddings(texts, modelToUse)
		} catch (error) {
			TelemetryService.instance.captureEvent(TelemetryEventName.CODE_INDEX_ERROR, {
				error: error instanceof Error ? error.message : String(error),
				stack: error instanceof Error ? error.stack : undefined,
				location: "AliyunEmbedder:createEmbeddings",
			})
			throw error
		}
	}

	/**
	 * 通过委托给底层的 OpenAI 兼容 embedder 来验证阿里云 embedder 配置
	 * @returns 解析为验证结果的 Promise，包含成功状态和可选的错误消息
	 */
	async validateConfiguration(): Promise<{ valid: boolean; error?: string }> {
		try {
			// 委托验证给 OpenAI 兼容的 embedder
			// 错误消息将特定于阿里云，因为我们使用的是阿里云的基础 URL
			return await this.openAICompatibleEmbedder.validateConfiguration()
		} catch (error) {
			TelemetryService.instance.captureEvent(TelemetryEventName.CODE_INDEX_ERROR, {
				error: error instanceof Error ? error.message : String(error),
				stack: error instanceof Error ? error.stack : undefined,
				location: "AliyunEmbedder:validateConfiguration",
			})
			throw error
		}
	}

	/**
	 * 返回此 embedder 的信息
	 */
	get embedderInfo(): EmbedderInfo {
		return {
			name: "aliyun",
		}
	}
}
